package concreto.neuronio;

import comportamento.neuronio.INeuronio;
import comportamento.neuronio.INeuronioAbstrato;

/**
 * Neuronio proposto por McCaullagh e Pitts
 * 
 * @author rgomes
 *
 */
public class NeuronioMP extends INeuronioAbstrato implements INeuronio{

    public NeuronioMP(double limiar) {
	super();
	super.limiar = limiar;
    }

    public double estimular(double[] estimulo) {

	return this.resposta(estimulo);
    }

    public void selecionarFuncaoAtivacao(int funcao) {

	super.selecionarFuncaoAtivacao(funcao);
    }

    @Override
    public double[] ponderarEstimulos(double[] estimulos) {
	
	this.estimulos = estimulos;
	int quantidadeEntradas = estimulos.length;
	
	double[] resultados = new double[quantidadeEntradas]; 
	geraPesosConexoes(quantidadeEntradas);
	
	for(int i = 0; i < quantidadeEntradas; i ++) {
	    resultados[i] = estimulos[i] * this.wk[i];
	}
	
	return resultados;
    }    
    
    @Override
    public void calcularUk(double[] vetorPesosConexao) {

	this.uk = 0.0;

	for(double valor : vetorPesosConexao) {
	    this.uk += valor;
	}
    }


    @Override
    public void geraPesosConexoes(int quantidadeEntradas) {

	this.wk = new double[quantidadeEntradas];

	for(int i = 0; i < quantidadeEntradas; i++) {
	    this.wk[i] = gerarValorRandomico();
	}
    }


    @Override
    public double resposta(double[] estimulos) {

	calcularUk(ponderarEstimulos(estimulos));
	this.y = this.funcaoAtivacao.ativarNeuronio(this.uk, this.valorLimiar());

	return this.y;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {

	StringBuffer neuronio = new StringBuffer("");

	String estimulos = "[";
	String pesos = "[";

	if(this.estimulos != null && this.estimulos.length > 0) {

	    for(double e : this.estimulos) {
		estimulos = estimulos.concat(e + ", ");
	    }
	    estimulos = estimulos.substring(0, estimulos.length()-2).concat("]");
	} else {
	    estimulos = estimulos.concat(" ]");
	}

	if(this.wk != null && this.wk.length > 0) {

	    for(double e : this.wk) {
		pesos = pesos.concat(e + ", ");
	    }
	    pesos = pesos.substring(0, pesos.length()-2).concat("]");
	} else {
	    pesos = pesos.concat(" ]");
	}

	neuronio.append("\nEstimulos: " + estimulos);
	neuronio.append("\nPesos das conexões: " +  pesos);
	neuronio.append("\nUk: " +  super.uk);
	neuronio.append("\ny: " + super.y);
	neuronio.append("\nLimiar: " + this.limiar);
	neuronio.append("\nBias: " + this.bk);

	return neuronio.toString();
    }

}
